﻿// Gateway.Api 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
// 
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
// 
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using Aurora.AI.Common.Options;
using Aurora.AI.Wiki.Domain;
using Aurora.AI.Wiki.Services;
using Aurora.AI.Wiki.Services.ChatApplication;
using Aurora.AI.Wiki.Services.Wiki;
using mem0.Core.VectorStores;
using mem0.NET.Options;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Options;

namespace Aurora.AI.Wiki;

public static class AiServiceExtension
{
    /// <summary>
    /// 注入服务 初始化表
    /// </summary>
    /// <param name="services"></param>
    /// <param name="configuration"></param>
    public static void AddWikiAiService(this IServiceCollection services, IConfiguration configuration)
    {
        // add json
        IConfigurationSection section = configuration.GetSection("AI.Wiki.Options");

        OpenAIOption.DbType =section["DbType"];
        OpenAIOption.ConnectionStrings = section["ConnectionStrings"];
        OpenAIOption.WikiConnection = section["WikiConnection"];
        OpenAIOption.WikiApiKey = section["WikiApiKey"];
        OpenAIOption.WikiVectorCollectionName = section["WikiVectorCollectionName"]??"wiki";
        services.AddSingleton<WikiMemoryService>();
        services.AddScoped<ChatApplicationService>();
        services.AddScoped<WikiSettingService>();
        services.AddScoped<WikiService>();
        services.AddScoped<WikiDetailService>();
        services.AddDomainService();
        AddWikiAiImagesService(services, configuration);
        AddWikiAiVideosService(services);
        // 向量
        services.AddOptions<QdrantOptions>().Bind(configuration.GetSection("AI.Wiki.Qdrant"));
        services.AddOptions<Mem0Options>().Bind(configuration.GetSection("AI.Wiki.Mem0"));
        var options = configuration.GetSection("AI.Wiki.Mem0")
            .Get<Mem0Options>();
        QdrantOptions qdrantOptions = configuration.GetSection("AI.Wiki.Qdrant").Get<QdrantOptions>();
        // 生成qdrant 配置
        if (qdrantOptions==null)
        {
            qdrantOptions = new QdrantOptions();
            Uri uri = new Uri(OpenAIOption.WikiConnection!);
            qdrantOptions.Host = uri.Host;
            qdrantOptions.Https = uri.Scheme.ToLower().Equals("https");
            qdrantOptions.Port = uri.Port;
            qdrantOptions.ApiKey = OpenAIOption.WikiApiKey!;
        }
        services.AddScoped<IHistoryService, HistoryService>();
        services.AddMem0DotNet(options)
            .WithVectorQdrant(qdrantOptions);
       
    }


    /// <summary>
    /// 注入服务 ai images 初始化表
    /// </summary>
    /// <param name="services"></param>
    /// <param name="configuration"></param>
    private static void AddWikiAiImagesService( IServiceCollection services, IConfiguration configuration)
    {
        IConfigurationSection section = configuration.GetSection("AI.Wiki.Options.Images");

        string size = section["Size"];

        OpenAIImagesOption.Size = size;
        services.AddScoped<AiImageGenerateService>();
    }
    
    /// <summary>
    /// 注入服务 ai videos 初始化表
    /// </summary>
    /// <param name="services"></param>
    /// <param name="configuration"></param>
    private static void AddWikiAiVideosService( IServiceCollection services)
    {
        services.AddScoped<AiVideoGenerateService>();
    }
}